package com.swa99ylum.pxf.sheet;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import org.apache.log4j.Logger;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFCellStyle;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;

import com.swa99ylum.pxf.Filler;
import com.swa99ylum.pxf.bean.Index;
import com.swa99ylum.pxf.row.RowFiller;
import com.swa99ylum.pxf.row.indexer.FixedRowIndexer;
import com.swa99ylum.pxf.row.indexer.RowIndexer;


//TODO: RowFiller 是不是 需要有 公式、样式、单元格类型
//TODO: "row 的 样式" 应当在 "cell 的 样式" 之前设置
public class SheetFiller extends Filler {
	
	private static Logger logger = Logger.getLogger(SheetFiller.class);
	
	private String[] sheetNames;//多个 sheet 页，可以使用 同一组 RowParser 去进行解析
	
	/**
	 * sheet 和 rowFillers 之间是 "多对一" 的 关系，
	 * 即 "多个sheet" 可以使用 "一组rowFillers" 进行填充
	 */
	private XSSFSheet[]			sheets;  //PXF.fill() 的时候会 赋值
	private RowFiller[]			rowFillers;
	
	
	/**
	 * styleMap 的 注入链
	 */
	@Override
	public void spreadStyleMap(Map<String, XSSFCellStyle> styleMap) {
		for (RowFiller rowFiller : rowFillers) {
			rowFiller.spreadStyleMap(styleMap);
		}
	}
	
//	@Override
//	public void spreadErrorHook(List<String> errors) {
//		for (RowParser rowParser : rowParsers) {
//			rowParser.spreadErrorHook(errors);
//		}
//		
//		for (SheetValidator sheetValidator : validators) {
//			sheetValidator.setErrors(errors);
//		}
//	}
	
	
	/*--------------------------------------------
    |      			1 个  构造器			         |
    ============================================*/
	/**
	 * 构造器
	 */
	public SheetFiller(String[] sheetNames, RowFiller[] rowFillers) {
		super();
		this.sheetNames = sheetNames;
		this.rowFillers = rowFillers;
	}
	
	


	/**
	 * 核心方法
	 */
	public void fill() throws Exception {
		for (XSSFSheet sheet : sheets) {
			
//			for (RowParser rowParser : rowParsers) {
//				//1、构建 XSSFRow[] rows
//				int beginIndex = rowParser.getBeginIndex();
//				int endIndex = rowParser.getEndIndex();
//				
//				XSSFRow[] rows = new XSSFRow[endIndex-beginIndex+1];
//				
//				for(int i=beginIndex; i<endIndex+1; i++) {
//					int index = i-beginIndex;
//					rows[index] = sheet.getRow(i);
//				}
//				
//				//2、将 rows 交给  rowParser
//				rowParser.setRows(rows);
//				
//				//3、解析 rowParser 中的  XSSFRow[] rows
//				rowParser.parse();
//				
//			}
			
			int globalRowIndex = -1;
			XSSFRow row;
			for (RowFiller rowFiller : rowFillers) {
				
				System.out.println(rowFiller);
				
				List<XSSFRow> rowList = new ArrayList<>();	//待 填值
				
				List<?> dataList = rowFiller.getDataList(); //规定了 高度，是下面 循环的 标准
				RowIndexer rowIndexer = rowFiller.getRowIndexer();
				
				//TODO：if rowIndexer == null，如果没有创建 rowIndexer，则 主动创建 一个
				if(rowIndexer == null) {
					rowIndexer = new FixedRowIndexer(globalRowIndex+1);
					rowFiller.setRowIndexer(rowIndexer);
					
				}else if(rowIndexer.hasParent()) {
					
					rowIndexer.cloneParentIndex();
					
				}else if(!rowIndexer.hasParent()){
					
					if(rowIndexer.getIndex() == null) {
						rowIndexer.setIndex(new Index(globalRowIndex+1));
						
					}else {
						/**
						 * RF 的 indexer 使用了 "使用 new Index() 创建" 的 index，
						 * 使用 此方式 创建的 index，值为 -1
						 */
						Index index = rowIndexer.getIndex();
						
						if(index.getValue() == -1) {
							index.initValue(globalRowIndex+1);
						}
					}
				}
				
				
				while(true) {
					row = sheet.getRow(rowIndexer.getIndexValue());
					
					if(rowIndexer.triggerBeginning(row)) 	break;
					else									rowIndexer.incrementIndexValue();
				}
				
				
				/*
				 * 设置 rowFiller 的 rows
				 */
				for (Object data : dataList) {
					
					//1、设置 rowList
					globalRowIndex = rowIndexer.getIndexValue();
					
					row = sheet.getRow(globalRowIndex);
					
					/** 如果有 "null 行"，则将他 补为 "blank 行" */
					if(row == null) row = sheet.createRow(globalRowIndex);
					
					rowList.add(row);
					
					rowIndexer.incrementIndexValue();
				}
				
				//2、
				XSSFRow[] rows = (XSSFRow[]) rowList.toArray(new XSSFRow[0]);
				rowFiller.setRows(rows);
				
				//3、
				rowFiller.fill();
			}
			
			//reset 之后，才能为 新的 行服务
			//注意：有时 cellParsers 的 indexer 会共享，也就是说 
			//多次 cellParser.getCellIndexer().resetIndex(); 可能 恢复的 是 同一个对象
			//不然会发生 无限循环:
			//XSSFRow row = sheet.getRow(i); 由于 i 没有被 reset，所以 取到的 row 为 null
			//导致 indexer.triggerBeginning(row) 总是 返回 false
			for (RowFiller rowFiller : rowFillers) {
				rowFiller.getRowIndexer().resetIndexValue();
				rowFiller.setBeginIndex(-1);
			}
			

			
			System.out.println("*****************");
			
		}
			
	}

	
	/*--------------------------------------------
    |      			getter、setter		         |
    ============================================*/
	public String[] getSheetNames() {
		return sheetNames;
	}
	
	public void setSheetNames(String[] sheetNames) {
		this.sheetNames = sheetNames;
	}

	public XSSFSheet[] getSheets() {
		return sheets;
	}

	public void setSheets(XSSFSheet[] sheets) {
		this.sheets = sheets;
	}

	public RowFiller[] getRowFillers() {
		return rowFillers;
	}

	public void setRowFillers(RowFiller[] rowFillers) {
		this.rowFillers = rowFillers;
	}


	
}
